//by zhanyi
function uParse(selector, opt) {

    var ie = !!window.ActiveXObject,
        cssRule = ie ? function (key, style, doc) {
            var indexList, index;
            doc = doc || document;
            if (doc.indexList) {
                indexList = doc.indexList;
            } else {
                indexList = doc.indexList = {};
            }
            var sheetStyle;
            if (!indexList[key]) {
                if (style === undefined) {
                    return ''
                }
                sheetStyle = doc.createStyleSheet('', index = doc.styleSheets.length);
                indexList[key] = index;
            } else {
                sheetStyle = doc.styleSheets[indexList[key]];
            }
            if (style === undefined) {
                return sheetStyle.cssText
            }
            sheetStyle.cssText = sheetStyle.cssText + '\n' + (style || '')
        } : function (key, style, doc) {
            doc = doc || document;
            var head = doc.getElementsByTagName('head')[0], node;
            if (!(node = doc.getElementById(key))) {
                if (style === undefined) {
                    return ''
                }
                node = doc.createElement('style');
                node.id = key;
                head.appendChild(node)
            }
            if (style === undefined) {
                return node.innerHTML
            }
            if (style !== '') {
                node.innerHTML = node.innerHTML + '\n' + style;
            } else {
                head.removeChild(node)
            }
        },
        domReady = function (onready) {
            var doc = window.document;
            if (doc.readyState === "complete") {
                onready();
            } else {
                if (ie) {
                    (function () {
                        if (doc.isReady) return;
                        try {
                            doc.documentElement.doScroll("left");
                        } catch (error) {
                            setTimeout(arguments.callee, 0);
                            return;
                        }
                        onready();
                    })();
                    window.attachEvent('onload', function () {
                        onready()
                    });
                } else {
                    doc.addEventListener("DOMContentLoaded", function () {
                        doc.removeEventListener("DOMContentLoaded", arguments.callee, false);
                        onready();
                    }, false);
                    window.addEventListener('load', function () {
                        onready()
                    }, false);
                }
            }

        },
        _each = function (obj, iterator, context) {
            if (obj == null) return;
            if (obj.length === +obj.length) {
                for (var i = 0, l = obj.length; i < l; i++) {
                    if (iterator.call(context, obj[i], i, obj) === false)
                        return false;
                }
            } else {
                for (var key in obj) {
                    if (obj.hasOwnProperty(key)) {
                        if (iterator.call(context, obj[key], key, obj) === false)
                            return false;
                    }
                }
            }
        },
        inArray = function (arr, item) {
            var index = -1;
            _each(arr, function (v, i) {
                if (v === item) {
                    index = i;
                    return false;
                }
            });
            return index;
        },
        pushItem = function (arr, item) {
            if (inArray(arr, item) == -1) {
                arr.push(item)
            }
        },
        loadFile = function () {
            var tmpList = [];

            function getItem(doc, obj) {
                try {
                    for (var i = 0, ci; ci = tmpList[i++];) {
                        if (ci.doc === doc && ci.url == (obj.src || obj.href)) {
                            return ci;
                        }
                    }
                } catch (e) {
                    return null;
                }

            }

            return function (doc, obj, fn) {
                var item = getItem(doc, obj);
                if (item) {
                    if (item.ready) {
                        fn && fn();
                    } else {
                        item.funs.push(fn)
                    }
                    return;
                }
                tmpList.push({
                    doc: doc,
                    url: obj.src || obj.href,
                    funs: [fn]
                });
                if (!doc.body) {
                    var html = [];
                    for (var p in obj) {
                        if (p == 'tag')continue;
                        html.push(p + '="' + obj[p] + '"')
                    }
                    doc.write('<' + obj.tag + ' ' + html.join(' ') + ' ></' + obj.tag + '>');
                    return;
                }
                if (obj.id && doc.getElementById(obj.id)) {
                    return;
                }
                var element = doc.createElement(obj.tag);
                delete obj.tag;
                for (var p in obj) {
                    element.setAttribute(p, obj[p]);
                }
                element.onload = element.onreadystatechange = function () {
                    if (!this.readyState || /loaded|complete/.test(this.readyState)) {
                        item = getItem(doc, obj);
                        if (item.funs.length > 0) {
                            item.ready = 1;
                            for (var fi; fi = item.funs.pop();) {
                                fi();
                            }
                        }
                        element.onload = element.onreadystatechange = null;
                    }
                };
                element.onerror = function () {
                    throw Error('The load ' + (obj.href || obj.src) + ' fails,check the url')
                };
                doc.getElementsByTagName("head")[0].appendChild(element);
            }
        }();


    var defaultOption = {
        liiconpath: 'http://bs.baidu.com/listicon/',
        listDefaultPaddingLeft: '20',
        'highlightJsUrl': '',
        'highlightCssUrl': '',
        customRule: function () {
        }
    };
    if (opt) {
        for (var p in opt) {
            defaultOption[p] = opt[p]
        }
    }
    domReady(function () {
        var contents;
        if (document.querySelectorAll) {
            contents = document.querySelectorAll(selector)
        } else {
            if (/^#/.test(selector)) {
                contents = [document.getElementById(selector.replace(/^#/, ''))]
            } else if (/^\./.test(selector)) {
                var contents = [];
                _each(document.getElementsByTagName('*'), function (node) {
                    if (node.className && new RegExp('\\b' + selector.replace(/^\./, '') + '\\b', 'i').test(node.className)) {
                        contents.push(node)
                    }
                })
            } else {
                contents = document.getElementsByTagName(selector)
            }
        }
        _each(contents, function (content) {
            if (content.tagName.toLowerCase() == 'textarea') {
                var tmpNode = document.createElement('div');
                if (/^#/.test(selector)) {
                    tmpNode.id = selector.replace(/^#/, '')
                } else if (/^\./.test(selector)) {
                    tmpNode.className = selector.replace(/^\./, '')
                }
                content.parentNode.insertBefore(tmpNode, content);
                tmpNode.innerHTML = content.value;
                content.parentNode.removeChild(content);
                content = tmpNode;
            }

            function fillNode(nodes) {
                _each(nodes, function (node) {
                    if (!node.firstChild) {
                        node.innerHTML = '&nbsp;'
                    }
                })

            }

            function checkList(nodes) {
                var customCss = [],
                    customStyle = {
                        'cn': 'cn-1-',
                        'cn1': 'cn-2-',
                        'cn2': 'cn-3-',
                        'num': 'num-1-',
                        'num1': 'num-2-',
                        'num2': 'num-3-',
                        'dash': 'dash',
                        'dot': 'dot'
                    };
                _each(nodes, function (list) {
                    if (list.className && /custom_/i.test(list.className)) {
                        var listStyle = list.className.match(/custom_(\w+)/)[1];
                        if (listStyle == 'dash' || listStyle == 'dot') {
                            pushItem(customCss, selector + ' li.list-' + customStyle[listStyle] + '{background-image:url(' + defaultOption.liiconpath + customStyle[listStyle] + '.gif)}');
                            pushItem(customCss, selector + ' ul.custom_' + listStyle + '{list-style:none;} ' + selector + ' ul.custom_' + listStyle + ' li{background-position:0 3px;background-repeat:no-repeat}');

                        } else {
                            var index = 1;
                            _each(list.childNodes, function (li) {
                                if (li.tagName == 'LI') {
                                    pushItem(customCss, selector + ' li.list-' + customStyle[listStyle] + index + '{background-image:url(' + defaultOption.liiconpath + 'list-' + customStyle[listStyle] + index + '.gif)}');
                                    index++;
                                }
                            });
                            pushItem(customCss, selector + ' ol.custom_' + listStyle + '{list-style:none;}' + selector + ' ol.custom_' + listStyle + ' li{background-position:0 3px;background-repeat:no-repeat}');
                        }
                        switch (listStyle) {
                            case 'cn':
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-1{padding-left:25px}');
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-2{padding-left:40px}');
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-3{padding-left:55px}');
                                break;
                            case 'cn1':
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-1{padding-left:30px}');
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-2{padding-left:40px}');
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-3{padding-left:55px}');
                                break;
                            case 'cn2':
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-1{padding-left:40px}');
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-2{padding-left:55px}');
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-3{padding-left:68px}');
                                break;
                            case 'num':
                            case 'num1':
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-1{padding-left:25px}');
                                break;
                            case 'num2':
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-1{padding-left:35px}');
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft-2{padding-left:40px}');
                                break;
                            case 'dash':
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft{padding-left:35px}');
                                break;
                            case 'dot':
                                pushItem(customCss, selector + ' li.list-' + listStyle + '-paddingleft{padding-left:20px}');
                        }
                    }
                });

                customCss.push(selector + ' .list-paddingleft-1{padding-left:0}');
                customCss.push(selector + ' .list-paddingleft-2{padding-left:' + defaultOption.listDefaultPaddingLeft + 'px}');
                customCss.push(selector + ' .list-paddingleft-3{padding-left:' + defaultOption.listDefaultPaddingLeft * 2 + 'px}');

                cssRule('list', selector + ' ol,' + selector + ' ul{margin:0;padding:0;}li{clear:both;}' + customCss.join('\n'), document);
            }

            var needParseTagName = {
                'table': function () {
                    cssRule('table',
                        selector + ' table.noBorderTable td,' + selector + ' table.noBorderTable th,' + selector + ' table.noBorderTable caption{border:1px dashed #ddd !important}' +
                            selector + ' table{margin-bottom:10px;border-collapse:collapse;display:table;}' +
                            selector + ' td,' + selector + ' th{ background:white; padding: 5px 10px;border: 1px solid #DDD;}' +
                            selector + ' caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' +
                            selector + ' th{border-top:2px solid #BBB;background:#F7F7F7;}' +
                            selector + ' td p{margin:0;padding:0;}',
                        document);
                },
                'ol': checkList,
                'ul': checkList,
                'pre': function (nodes) {
                    if (typeof XRegExp == "undefined") {
                        loadFile(document, {
                            id: "syntaxhighlighter_js",
                            src: defaultOption.highlightJsUrl,
                            tag: "script",
                            type: "text/javascript",
                            defer: "defer"
                        }, function () {
                            _each(nodes, function (pi) {
                                if (pi && /brush/i.test(pi.className)) {
                                    SyntaxHighlighter.highlight(pi);
//                                    var tables = document.getElementsByTagName('table');
//                                    for(var t= 0,ti;ti=tables[t++];){
//                                        if(/SyntaxHighlighter/i.test(ti.className)){
//                                            var tds = ti.getElementsByTagName('td');
//                                            for(var i=0,li,ri;li=tds[0].childNodes[i];i++){
//                                                ri = tds[1].firstChild.childNodes[i];
//                                                if(ri){
//                                                    ri.style.height = li.style.height = ri.offsetHeight + 'px';
//                                                }
//                                            }
//                                        }
//                                    }
                                }
                            });
                        });
                    }
                    if (!document.getElementById("syntaxhighlighter_css")) {
                        loadFile(document, {
                            id: "syntaxhighlighter_css",
                            tag: "link",
                            rel: "stylesheet",
                            type: "text/css",
                            href: defaultOption.highlightCssUrl
                        });
                    }


                },
                'td': fillNode,
                'th': fillNode,
                'caption': fillNode

            };

            for (var tag in needParseTagName) {
                var nodes = content.getElementsByTagName(tag);
                if (nodes.length) {
                    needParseTagName[tag](nodes)
                }
            }
            defaultOption.customRule(content);
        });


    })
}